#lang scheme


(define (z1 mtx1 mtx2)
  (map (λ (str1 str2)                        ; пробегаемся по всем строкам
         (map (λ (elem1 elem2)               ; пробегаемся по всем элементам строк
                (+ elem1 elem2)) str1 str2)) ; находим сумму элементов
       mtx1 mtx2))

;--------------------------------------------------------------------------------------------------------

; пробегаясь по всем строкам и элементам, сравниваем их с нулем (если все больше либо равны - #t) иначе #f
(define (z2 mtx)
  (andmap (λ (str) (andmap  (λ (el) (>= el 0)) str)) mtx))

;--------------------------------------------------------------------------------------------------------

(define (z3 mtx)
  (define ids (build-list (length (car mtx)) add1)) ; список индексов
  (andmap
   (λ (str i)                                       ; пробегаемся по всем строкам и их индексам
     (andmap (λ (el j)                               ; пробегаемся по всем элементам и индексам стоблцов
               (or (>= i j) (= el 0))) str ids))     ; если над главной диагональю все элементы - нули
   mtx ids))

;--------------------------------------------------------------------------------------------------------


(define (z4 mtx)
  (and
   ; сравниваем сумму строки, из которой вычли a(ii) элемент, с самим элементом
   (andmap (λ (lst j) (>= (* 2 (abs (list-ref lst j))) (foldl (λ (x y) (+ y (abs x))) 0 lst)))
           mtx (build-list (length mtx) (λ (x) x)))
   ; по условию одно из неравенств должно быть строгим
   (ormap (λ (lst j) (> (* 2 (abs (list-ref lst j))) (foldl (λ (x y) (+ y (abs x))) 0 lst))) 
          mtx (build-list (length mtx) (λ (x) x)))))

;--------------------------------------------------------------------------------------------------------

(define (z5 n)
  (define lst (build-list (- n 1) add1)) ; индексы и первая строка
  (foldl (λ (i res)
             (cons (append (drop lst i) (take lst i)) res)) '() lst))
; i = [1..n-1]
; пока i != n добавляем в начало res список lst[i:]+lst[:i]
; т.о. reverse не применяем
;--------------------------------------------------------------------------------------------------------

(define (z6 mtx)
  (foldl (λ (str num)                       ; пробегаем все строки. str - текущая строка, num - кол-во нулевых строк
           (if (andmap (λ (x) (= x 0)) str) ; строка нулевая?
               (+ 1 num)
               num
         )) 0 mtx))                         ; num = 0, str in mtx


















